// api/request.js
const app = getApp();

/**
 * 封装 wx.request 请求
 * @param {Object} options - 请求配置
 * @param {String} options.url - 请求地址
 * @param {String} options.method - 请求方法
 * @param {Object} options.data - 请求数据
 * @param {Boolean} options.needToken - 是否需要token
 * @returns {Promise} - 返回Promise对象
 */
function request(options) {
  return new Promise((resolve, reject) => {
    // 默认参数
    const baseUrl = app.globalData.apiBase || 'http://localhost:8080';
    const token = wx.getStorageSync('token');

    // console.log(`发起请求: ${baseUrl}${options.url}`, options);

    wx.request({
      url: `${baseUrl}${options.url}`,
      data: options.data,
      method: options.method || 'GET',
      header: {
        'content-type': 'application/json',
        'Authorization': options.needToken !== false && token ? `Bearer ${token}` : ''
      },
      success: (res) => {
        // console.log(`请求成功: ${options.url}`, res);
        
        // 请求成功，状态码 200
        if (res.statusCode === 200) {
          // 判断业务状态码
          if (res.data && res.data.code === 0) {
            // 返回数据部分
            resolve(res.data);
          } else {
            // 业务错误
            wx.showToast({
              title: res.data && res.data.msg ? res.data.msg : '请求失败',
              icon: 'none'
            });
            reject(res.data || '请求失败');
          }
        } else if (res.statusCode === 401) {
          // token 过期，重新登录
          wx.showToast({
            title: '登录已过期，请重新登录',
            icon: 'none'
          });
          // 清除token
          wx.removeStorageSync('token');
          wx.removeStorageSync('userInfo');
          // 跳转到登录页
          setTimeout(() => {
            wx.redirectTo({
              url: '/pages/login/index'
            });
          }, 1500);
          reject(res);
        } else {
          // 其他错误
          wx.showToast({
            title: `网络错误 ${res.statusCode}，请稍后再试`,
            icon: 'none'
          });
          reject(res);
        }
      },
      fail: (err) => {
        console.error(`请求失败: ${options.url}`, err);
        wx.showToast({
          title: '网络连接失败',
          icon: 'none'
        });
        reject(err);
      }
    });
  });
}

// 新增post方法
function post(url, data, options = {}) {
  return request({
    url,
    data,
    method: 'POST',
    ...options
  });
}

// 新增get方法
function get(url, data, options = {}) {
  return request({
    url,
    data,
    method: 'GET',
    ...options
  });
}

// 新增put方法
function put(url, data, options = {}) {
  return request({
    url, 
    data,
    method: 'PUT',
    ...options
  });
}

// 新增delete方法
function del(url, data, options = {}) {
  return request({
    url,
    data,
    method: 'DELETE',
    ...options
  });
}

module.exports = {
  request,
  post,
  get,
  put,
  delete: del
}; 